package com.mastercard.assets.web.struts.actions;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblAssetSolicitud;
import com.mastercard.assets.jpa.TblCategoria;
import com.mastercard.assets.jpa.TblCuenta;
import com.mastercard.assets.jpa.TblCuentaPaquete;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblSubcateg;
import com.mastercard.assets.jpa.TblTipoCuenta;
import com.mastercard.assets.jpa.TblTipoCuentaPaquete;
import com.mastercard.assets.notifications.NotificationUtil;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.AssetAltaForm;
import com.mastercard.assets.web.struts.forms.AssetAsignarPaquetesForm;
import com.mastercard.assets.web.struts.forms.AssetBorrarForm;
import com.mastercard.assets.web.struts.forms.AssetBuscarForm;
import com.mastercard.assets.web.struts.forms.AssetEditarForm;
import com.mastercard.assets.web.struts.forms.AssetModificarPaquetesForm;
import com.mastercard.assets.web.struts.forms.AutorizarPaqueteRegistrarForm;
import com.mastercard.assets.web.struts.forms.LoginForm;
import com.mastercard.assets.web.struts.forms.SolicitarPaqueteRegistrarForm;
import com.mastercard.assets.web.util.to.PaqueteAutorizar;
import com.mastercard.assets.web.util.to.PaqueteSolicitar;
import com.mastercard.assets.web.util.to.UserLogin;

public class AutorizarPaqueteRegistrar
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el form
		AutorizarPaqueteRegistrarForm f = ( AutorizarPaqueteRegistrarForm ) form ;
		
		String[ ] registro = f.getRegistro( ) ;
		
		System.out.println( "### Registros: " + registro.length ) ;
		
		for( String reg : registro )
		{
			// en caos de que venga vaci
			if( reg == null || reg.trim( ).length( ) == 0 )
				// continua al siguiente
				continue ;
			
			// toma el primero
			System.out.println( "### \tRegistro: " + reg ) ;

			String[ ] tokens = reg.split( "-" ) ;

			// verifica en que empieza
			// en caso de que sea para autorizar
			if( tokens[ 0 ].startsWith( "Aut" ) )
			{
                try {
                    System.out.print( "A registrar:" ) ;
                    int numPaq = 0 ;
                    int tipoHabitacion = 1 ;
                    TblAsset asset = null ;
                    TblCuenta cuenta = null ;
                    
                    for( int i = 1 ; i < tokens.length ; i++ )
                    {
                            try
                            {
                                    // cambia a numero
                                    int sol = Integer.parseInt( tokens[ i ] ) ;
                                    
                                    MasterCardDAO.autorizarSolicitud( sol , user ) ;
                                    
                                    // lanza notificacion
                                    TblAssetSolicitud solicitud = MasterCardDAO.findSolicitudById( sol ) ;
                                    
                                    List< TblTipoCuentaPaquete > tcps = solicitud.getTblTipoCuentaPaquetes( ) ;
                                    cuenta = solicitud.getTblCuenta( ) ;
//						int numPaq = 0 ;
//						int tipoHabitacion = 1 ;
//						TblAsset asset = null ;
                                    
                                    for( TblTipoCuentaPaquete p : tcps )
                                    {
                                            if( p.getStatus( ) == 1 )
                                                    numPaq++ ;
                                            
                                            // primer registro
                                            if( numPaq == 1 )
                                            {
                                                    TblPaquete paq = p.getTblPaquete( ) ;
                                                    
                                                    tipoHabitacion = paq.getHabitacion( ) ;
                                                    
                                                    asset = paq.getTblAsset( ) ;
                                            }
                                    }
                                    
                                    //NotificationUtil.throwNotificationTypeAuthorizePackage( numPaq , tipoHabitacion , asset , user , solicitud.getTblCuenta( ) ) ;
                                    
                                    System.out.print( tokens[ i ] ) ;
                            }catch( Exception e )
                            {
                                MasterCardDAO.closeEntityManager( ) ;
                                    e.printStackTrace( ) ;
                            }
                    }
                    NotificationUtil.throwNotificationTypeAuthorizePackage( numPaq , tipoHabitacion , asset , user , cuenta ) ;
                    System.out.println( ) ;
                } catch (MasterCardException ex) {
                    MasterCardDAO.closeEntityManager( ) ;
                    Logger.getLogger(AutorizarPaqueteRegistrar.class.getName()).log(Level.SEVERE, null, ex);
                }
			}
			// en caso de no autorizar
			else
			{
                try {
                    System.out.print( "A rechazar:" ) ;
                    int numPaq = 0 ;
                    int tipoHabitacion = 1 ;
                    TblAsset asset = null ;
                    TblCuenta cuenta = null ;
                    
                    for( int i = 1 ; i < tokens.length ; i++ )
                    {
                            try
                            {
                                    // cambia a numero
                                    int sol = Integer.parseInt( tokens[ i ] ) ;
                                    
                                    MasterCardDAO.noAutorizarSolicitud( sol , user ) ;
                                    
                                    // lanza notificacion
                                    TblAssetSolicitud solicitud = MasterCardDAO.findSolicitudById( sol ) ;
                                    
                                    List< TblTipoCuentaPaquete > tcps = solicitud.getTblTipoCuentaPaquetes( ) ;
                                    cuenta = solicitud.getTblCuenta( ) ;
//						int numPaq = 0 ;
//						int tipoHabitacion = 1 ;
//						TblAsset asset = null ; 
                                    
                                    for( TblTipoCuentaPaquete p : tcps )
                                    {
                                            if( p.getStatus( ) == 1 )
                                                    numPaq++ ;
                                            
                                            // primer registro
                                            if( numPaq == 1 )
                                            {
                                                    TblPaquete paq = p.getTblPaquete( ) ;
                                                    
                                                    tipoHabitacion = paq.getHabitacion( ) ;
                                                    
                                                    asset = paq.getTblAsset( ) ;
                                            }
                                    }
                                    
                                    //NotificationUtil.throwNotificationTypeRejectPackage( numPaq , tipoHabitacion , asset , user , solicitud.getTblCuenta( ) ) ;
                                    
                                    System.out.print( tokens[ i ] ) ;
                            }catch( Exception e )
                            {
                                MasterCardDAO.closeEntityManager( ) ;
                                    e.printStackTrace( ) ;
                            }
                    }
                    NotificationUtil.throwNotificationTypeRejectPackage( numPaq , tipoHabitacion , asset , user , cuenta ) ;
                    System.out.println( ) ;
                } catch (MasterCardException ex) {
                    MasterCardDAO.closeEntityManager( ) ;
                    Logger.getLogger(AutorizarPaqueteRegistrar.class.getName()).log(Level.SEVERE, null, ex);
                }
			}
		}
		
//		// toma los paquetes a autorizar
//		List< PaqueteAutorizar > paquetesAutorizar = f.getPackageManager( ).getPaqueteAutorizarLista( ) ;
//		
//		// toma el orden de las cuentas hermanas
//		int[ ] bindCountsIdOrder = f.getCountIdOrder( ) ;
//		
//		// los recorre
//		for( PaqueteAutorizar paqAut : paquetesAutorizar )
//		{
//			// toma los datos de autorizacion
//			int[ ] packageAuth = paqAut.getAutorizados( ) ;
//			
//			// recorre los id de las cuentas hermanas
//			for( int cveCuenta : bindCountsIdOrder )
//			{
//				// manda datos para autorizar solicitudes
//			}
//		}
//		
		// en caso de que se cumpla, guarda el WorkArea
		//user.setNextWorkArea( "/SolicitarPaqueteIn.do" ) ;
                // Modifiacion para mandar a la pantalla de Assets :::::::
                user.setNextWorkArea( "/ListarPaquetesAsignadosIn.do" ) ;
		
                MasterCardDAO.closeEntityManager( ) ;
	  	return mapping.findForward( "success" ) ;
	}
	
}
